package com.hongxin.nw.netty.utils;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import java.util.Iterator;
import java.util.Map;

/**
 * 修改JSON的key为小写或者大写
 *
 * @Title ModifyJsonKeyToUpperUtil
 * @Desripction
 * @Date 2019-3-7 下午3:05:48
 * @Package com.jh.jcs.framework.web.util
 */
@SuppressWarnings("rawtypes")
public class ModifyJsonKeyUtil {

	public static final String STRING_KEY = "String";

	public static final String JSONOBJECT_KEY = "JSONObject";

	public static final String JSONARRAY_KEY = "JSONArray";


    /**
     * 移除json中value为""的key
     * @param json
     * @return
     */
	public static com.alibaba.fastjson.JSONObject removeEmptyKey(com.alibaba.fastjson.JSONObject json){
        // 去掉value为空的键值对
        Iterator<Map.Entry<String, Object>> it = json.entrySet().iterator();
        while (it.hasNext()){
            Map.Entry<String, Object> temp = it.next();
            if (temp.getValue().toString().length()<1){
                it.remove();
            }
        }
        return json;
    }

	/**
	 * 修改json的key为大写或者小写
	 *
	 * @Description
	 * @Date 2019-3-7下午3:07:32
	 * @param jsonObject
	 * @param transferMode 当值为true时，说明是转小写，false为转大写
	 * @return
	 * @throws
	 */
	public static JSONObject transferJsonKey(JSONObject jsonObject, boolean transferMode) {
		JSONObject object = new JSONObject();
		Iterator iterator = jsonObject.keySet().iterator();
		while (iterator.hasNext()) {
			String jsonKey = (String) iterator.next();
			String arrkey = jsonKey;
			Object valueObject = jsonObject.get(jsonKey);
			if (transferMode) {
				jsonKey = jsonKey.toLowerCase();
			} else {
				jsonKey = jsonKey.toUpperCase();
			}
			if (valueObject.getClass().toString().endsWith(STRING_KEY)) {
				object.accumulate(jsonKey, valueObject);
			} else if (valueObject.getClass().toString().endsWith(JSONOBJECT_KEY)) {
				JSONObject checkObject = JSONObject.fromObject(valueObject);
				// 当值为null时，valueObject还是JSONObject对象，判空是不成立的，要判断是否是nullObject
				if (!checkObject.isNullObject()) {
					object.accumulate(jsonKey, transferJsonKey((JSONObject) valueObject, transferMode));
				} else {
					object.accumulate(jsonKey, null);
				}
			} else if (valueObject.getClass().toString().endsWith(JSONARRAY_KEY)) {
//				JSONArray checkObject = JSONArray.fromObject(valueObject);
//				// 当值为null时，valueObject还是JSONObject对象，判空是不成立的，要判断是否是nullObject
//				if (!(checkObject == null)) {
//					JSONArray arr = jsonObject.getJSONArray(arrkey);
//					object.accumulate(jsonKey, transferJsonArray(arr, transferMode));
//				} else {
//					object.accumulate(jsonKey, null);
//				}
				JSONArray arr = jsonObject.getJSONArray(arrkey);
				object.accumulate(jsonKey, transferJsonArray(arr, transferMode));
			}
		}
		return object;
	}

	/**
	 * JSONArray key大小写转换
	 *
	 * @Description
	 * @Date 2019-3-7下午3:28:30
	 * @param jsonArray
	 * @param transferMode
	 * @return
	 * @throws
	 */
	public static net.sf.json.JSONArray transferJsonArray(JSONArray jsonArray, boolean transferMode) {
		JSONArray array = new JSONArray();
		if (null != jsonArray && jsonArray.size() > 0) {
			for (Object object : jsonArray) {
				if (object.getClass().toString().endsWith(JSONOBJECT_KEY)) {
					array.add(transferJsonKey((JSONObject) object, transferMode));
				} else if (object.getClass().toString().endsWith(JSONARRAY_KEY)) {
					array.add(transferJsonArray((JSONArray) object, transferMode));
				}
			}
		}
		return array;
	}


	/**
	 * 修改json的key首字母为大写或者小写
	 *
	 * @Description
	 * @Date 2019-3-7下午3:07:32
	 * @param jsonObject
	 * @param transferMode 当值为true时，说明是转小写，false为转大写
	 * @return
	 * @throws
	 */
	public static JSONObject transferJsonKeyA(JSONObject jsonObject, boolean transferMode) {
		JSONObject object = new JSONObject();
		Iterator iterator = jsonObject.keySet().iterator();
		while (iterator.hasNext()) {
			String jsonKey = (String) iterator.next();
			String arrkey = jsonKey;
			Object valueObject = jsonObject.get(jsonKey);
			if (transferMode) {
				jsonKey = lowerCase(jsonKey);
			} else {
				jsonKey = upperCase(jsonKey);
			}
			if (valueObject.getClass().toString().endsWith(STRING_KEY)) {
				object.accumulate(jsonKey, valueObject);
			} else if (valueObject.getClass().toString().endsWith(JSONOBJECT_KEY)) {
				JSONObject checkObject = JSONObject.fromObject(valueObject);
				// 当值为null时，valueObject还是JSONObject对象，判空是不成立的，要判断是否是nullObject
				if (!checkObject.isNullObject()) {
					object.accumulate(jsonKey, transferJsonKey((JSONObject) valueObject, transferMode));
				} else {
					object.accumulate(jsonKey, null);
				}
			} else if (valueObject.getClass().toString().endsWith(JSONARRAY_KEY)) {
//				JSONArray checkObject = JSONArray.fromObject(valueObject);
//				// 当值为null时，valueObject还是JSONObject对象，判空是不成立的，要判断是否是nullObject
//				if (!(checkObject == null)) {
//					JSONArray arr = jsonObject.getJSONArray(arrkey);
//					object.accumulate(jsonKey, transferJsonArray(arr, transferMode));
//				} else {
//					object.accumulate(jsonKey, null);
//				}
				JSONArray arr = jsonObject.getJSONArray(arrkey);
				object.accumulate(jsonKey, transferJsonArrayA(arr, transferMode));
			}
		}
		return object;
	}

	/**
	 * JSONArray key首字母大小写转换
	 *
	 * @Description
	 * @Date 2019-3-7下午3:28:30
	 * @param jsonArray
	 * @param transferMode
	 * @return
	 * @throws
	 */
	public static net.sf.json.JSONArray transferJsonArrayA(JSONArray jsonArray, boolean transferMode) {
		JSONArray array = new JSONArray();
		if (null != jsonArray && jsonArray.size() > 0) {
			for (Object object : jsonArray) {
				if (object.getClass().toString().endsWith(JSONOBJECT_KEY)) {
					array.add(transferJsonKeyA((JSONObject) object, transferMode));
				} else if (object.getClass().toString().endsWith(JSONARRAY_KEY)) {
					array.add(transferJsonArrayA((JSONArray) object, transferMode));
				}
			}
		}
		return array;
	}

	public static String upperCase(String str) {
		return str.substring(0, 1).toUpperCase() + str.substring(1);
	}

	public static String lowerCase(String str) {
		return str.substring(0, 1).toLowerCase() + str.substring(1);
	}

}
